﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Web;
using System.Web.Mvc;
using FotoLab.DataLayer.JpegStorage;
using FotoLab.DomainLayer.Model;
using FotoLab.DomainLayer.Helper;
using FotoLab.DomainLayer;
using System.Data.Entity;
using System.Linq;

namespace FotoLab.Controllers
{
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }

        public ActionResult About()
        {
            ViewBag.Message = "Over FotoLab.";
            return View();
        }

        public ActionResult Contact()
        {
            ViewBag.Message = "Contact.";

            return View();
        }

        public ActionResult EFStartOver()
        {
            Database.SetInitializer(new DropCreateDatabaseIfModelChanges<DomainContext>());
            return MaakFotograafPeter();
        }

        public ActionResult TestToonFotograaf(string fotograafId)
        {
            Fotograaf fotograaf = null;

            var context = new DomainContext();
            if (fotograafId != null)
            {
                fotograaf = context.Fotografen.Find(Guid.Parse(fotograafId));
            }
            else
            {
                foreach (var f in context.Fotografen.Take(() => 1))
                {
                    fotograaf = f;
                }
            }


            if (fotograaf != null)
            {
                context.Entry(fotograaf).Reference(f => f.FactuurAdres).Load();
            }

            ViewBag.Fotograaf = fotograaf;
            return View();
        }

        public ActionResult MaakFotograafPeter()
        {
            Fotograaf fotograaf = null;

            var context = new DomainContext();
            fotograaf = context.Fotografen.FirstOrDefault(f => f.GebruikersNaam == "petervanderwal");
            if (fotograaf == null)
            {
                fotograaf = new Fotograaf()
                {
                    GebruikersNaam = "petervanderwal",
                    Email = "fotograaf@petervanderwal.nl",
                    Naam = new Naam()
                    {
                        Aanhef = "De heer",
                        Voornaam = "Peter",
                        Tussenvoegsel = "van der",
                        Achternaam = "Wal",
                    },
                    Status = Gebruiker.GebruikerStatus.ACTIEF,
                    Telefoon = "0612345678",
                };

                fotograaf.NieuwWachtwoord("abc_123");

                var factuurAdres = context.Adressen.Find("7543CM", "77");
                if (factuurAdres == null)
                {
                    fotograaf.FactuurAdres = new Adres
                    {
                        Straatnaam = "Ypkemeulestraat",
                        Huisnummer = "77",
                        Postcode = "7543CM",
                        Plaats = "Enschede"
                    };
                }
                else
                {
                    fotograaf.FactuurAdres = factuurAdres;
                }

                context.Fotografen.Add(fotograaf);
                context.SaveChanges();
            }

            return RedirectToAction("TestToonFotograaf", new { fotograafId = fotograaf.Id.ToString() });
        }

        public ActionResult UploadTest()
        {
            ViewBag.IsUpload = false;
            return View();
        }

        [HttpPost]
        public ActionResult SaveUploadedFile()
        {
            bool isSavedSuccessfully = true;
            string fName = "";

            try
            {
                foreach (string fileName in Request.Files)
                {
                    HttpPostedFileBase file = Request.Files[fileName];
                    //Nu even lokale save, maar dit moet de blob worden
                    fName = file.FileName;

                    if (file != null && file.ContentLength > 0)
                    {
                        Foto foto = new Foto()
                        {
                             OorspronkelijkeBestandsnaam = file.FileName,
                            // Upload = upload,
                        };

                        var context = new DomainContext();
                        context.Fotos.Add(foto);
                        context.SaveChanges();

                        foto.StoreJpeg(file.InputStream);
                    }
                    ViewBag.IsUpload = true;
                    ViewData["Test"] = true;
                }

            }
            catch (Exception ex)
            {
                isSavedSuccessfully = false;
            }

            if (isSavedSuccessfully)
            {
                //return Json(new { Message = fName });
                ViewBag.Message = "Upload is geslaagd";
                return Json(new { Message = "Upload is geslaagd" });
                //return Json(isSavedSuccessfully = true, JsonRequestBehavior.AllowGet);

            }
            else
            {
                ViewBag.Message = "Bestand upload is mislukt";
                return Json(new { Message = "Bestand upload is mislukt" });
            }
        }

        [HttpPost]
        public ActionResult UploadTest(IEnumerable<HttpPostedFileBase> fotos)
        {
            if (fotos != null)
            {
                foreach (var file in fotos)
                {
                    // Verify that the user selected a file
                    if (file != null && file.ContentLength > 0)
                    {
                        ViewBag.IsUpload = true;

                        Foto foto = new Foto()
                        {
                            OorspronkelijkeBestandsnaam = file.FileName
                        };

                        var context = new DomainContext();
                        context.Fotos.Add(foto);
                        context.SaveChanges();

                        foto.StoreJpeg(file.InputStream);
                        ViewBag.FotoId = foto.Id;
                    }
                    else
                    {
                        ViewBag.IsUpload = false;
                    }
                }
            }
            return View();
        }

        public FileResult HighResImageTest(string fotoId)
        {
            return DownloadImage(fotoId, JpegResolutie.High);
        }

        public FileResult MediumImageTest(string fotoId)
        {
            return DownloadImage(fotoId, JpegResolutie.Medium);
        }

        public FileResult ThumbnailImageTest(string fotoId)
        {
            return DownloadImage(fotoId, JpegResolutie.Thumbnail);
        }

        private FileStreamResult DownloadImage(string fotoId, JpegResolutie resolutie)
        {
             Foto foto = new Foto()
             {
                Id = Guid.Parse(fotoId)
             };
             return new FileStreamResult(foto.GetJpeg(resolutie), "image/jpeg");
        }

        public ActionResult DeleteAllBlobs()
        {
            return View();
        }

        [HttpPost]
        public ActionResult DoDeleteAllBlobs()
        {
            foreach(JpegResolutie resolutie in Enum.GetValues(typeof(JpegResolutie)))
            {
                AzureJpegStorage storage = JpegStorageFactory.GetStorageForResolutie(resolutie) as AzureJpegStorage;
                // Null als ander type
                if (storage != null)
                {
                    storage.DeleteAll();
                }
            }
            return Json(new { Message = "Bestanden verwijderd" });
        }

    }
}